<?php

require_once("dao/ClientDao.php");
require_once("dao/DetailClientDao.php");
require_once("dao/CorrespondanceDestinationDao.php");

/**
 * Controller de facturation fixes
 */
class FacturationFixeController {

    private $errorReporting = null;
    private $pdfFooter      = null;

    public function __construct() {
        $this->errorReporting['unconsistent_type'] = 0;
    }

    public function process() {

        // Récupération des données cliens->abonements->appels.
        $datas = ClientDao::findByCdr($this->getFacturationPeriod());
        // Pour chaque client, construction de la facture
        foreach ($datas['clients'] as $client) {
            //@todo prorata remplacement abonnement
            $prixTotalForfaits = 0;
            $prixTotal         = 0;

            // Montants pour chaqe abonnement
            foreach ($client['details'] as $detail) {

                // Control abonnements regoupés
                $abonnement                   = $this->getAbonnement($detail['abonnement']);
                //------------------------- DEBUT du calcul du prix final
                $reductionAbonnement          = $abonnement['abonnement'];
                $reductionMinuteNational      = $abonnement['minute_national'];
                $reductionMinuteInternational = $abonnement['minute_international'];
                $grilleTarifaire              = !empty($abonnement['grille_tarifaire']) ? $abonnement['grille_tarifaire'] : 'tarif_1';
                $prixTotal                    = $abonnement['nbr_offre'] * $abonnement['prix'];
                //calcul de la remise
                $prixTotal                    = $prixTotal - (($prixTotal * $reductionAbonnement) / 100);
                //calcul prorata mois en cours
                if (date("m/Y", $detail['date_souscription']) === date("m/Y", $this->startDate) and $abonnement['facturee'] != '1') {

                    $nbJoursMois                                     = intval(date("t", $this->startDate));
                    $nbJoursEcart                                    = $nbJoursMois - date("j", $detail['date_souscription']) + 1;
                    $prixTotalMoisComplet                            = $abonnement['nbr_offre'] * $prixTotal;
                    $prixTotal                                       = ($nbJoursEcart * ($abonnement['nbr_offre'] * $prixTotal)) / $nbJoursMois;
                    $detail['abonnement']['prix_total_mois_complet'] = $prixTotalMoisComplet;
                }

                $detail['abonnement']['prix_total'][] = $prixTotal;
                //------------------------- FIN du calcul du prix final

                $prixTotalLigne                      = $prixTotalLigne + $prixTotal + $prixTotalMoisComplet;
                $detail['abonnement']['total_ligne'] = $prixTotalLigne;

                $prixTotalForfaits += $prixTotal + $prixTotalMoisComplet;

                // Pour chaque appels,
                foreach ($detail['appels'] as $appel) {
                    // 1 - on récupère la destination d'appel en fonction de celle-ci et du type d'abo
                    if (!$destinationTarif = $this->getDestinationTarif($appel['called_num'], $abonnement['type_offre'])) {
                        continue;
                    }

                    // Récupération du bon tarif
                    $tarif = (float) $destinationTarif[$grilleTarifaire];

                    //@todo: Control abonnement illimité
                    //@todo: décompte à la minute ou seconde
                    $montantTotalAppels += $tarif * ($appel['duration'] / 60);
                }
            }
            $client['montant_total_forfait'] = $prixTotalForfaits;
            // Equipement
            $client += $this->getEquipementForClient($client['code_client_hto']);
            // Totaux
            $pdf                             = $this->generatePdf($client);
        }
    }

    /**
     * 
     * @global type $twig
     * @param array $param
     */
    protected function generatePdf($param) {
//        $param = array(
//            'code_client_hto' => 'foo',
//            'nom'             => 'foo',
//            'details'         => array(
//                0 => array(
//                    'abonnement'    => array(),
//                    'appels'        => array(),
//                    'duree_total'   => 3,
//                    'detail_durees' => array(
//                        'fixe' => array(
//                            'libelle'      => 'fixe',
//                            'duree'        => 3,
//                            'hors_forfait' => 3,
//                            'cout_reel'    => 3.0
//                        ),
//                        'mobile' => array(
//                            'libelle'      => 'fixe',
//                            'duree'        => 3,
//                            'hors_forfait' => 3,
//                            'cout_reel'    => 3.0
//                        ),
//                        'international' => array(
//                            'libelle'      => 'fixe',
//                            'duree'        => 3,
//                            'hors_forfait' => 3,
//                            'cout_reel'    => 3.0
//                        ),
//                        'autre' => array(
//                            'libelle'      => 'fixe',
//                            'duree'        => 3,
//                            'hors_forfait' => 3,
//                            'cout_reel'    => 3.0
//                        )
//                    )
//                )
//            )
//        );


        global $twig;
        // Number format
        $twig->getExtension('core')->setNumberFormat(2, '.', ',');
        $param['footer'] = $this->getPdfFooter();
        ob_start();
        $html            = $twig->render('pdf/facture-fixe.pdf.twig', $param);
        ob_get_clean();
        /*         * ******************* DEBUG ********************** */
        var_dump($html);
        die();
        /*         * ******************* DEBUG ********************** */
    }

    /**
     * Retourne le footer du pdf
     * @return html
     */
    protected function getPdfFooter() {
        // récupération du pied de page 
        if (is_null($this->pdfFooter)) {
            $myFile          = "facture.txt";
            $fh              = fopen($myFile, 'r');
            $this->pdfFooter = fread($fh, filesize($myFile));
            fclose($fh);
        }
        return $this->pdfFooter;
    }

    /**
     * Retourne tarif destination
     * @param type $phoneNumber
     * @param type $typeOffer
     * @return boolean
     */
    protected function getDestinationTarif($phoneNumber, $typeOffer) {
        // control type d'offre cohérent
        if (!in_array($typeOffer, array('voip', 'vga'))) {
            $this->errorReporting['unconsistent_types'] ++;
            $this->errorReporting['error_messages'][] = "Type d'offre $typeOffer incohérent.";
            return false;
        }
        // control récupération de taif
        if (!$destination = CorrespondanceDestinationDao::findByPhoneNumber($phoneNumber, $typeOffer)) {
            $this->errorReporting['destination_tarif_not_found'] ++;
            $this->errorReporting['error_messages'][] = "Pas de tarif trouvé pour le numéro '$phoneNumber' et l'offre '$typeOffer'.";
            return false;
        }

        return $destination;
    }

    /**
     * Retourne la date de début et la date de fin de facturation dans un tableau
     * 
     * @return DateTime[]
     */
    protected function getFacturationPeriod() {
        $startDate = new DateTime();
        if (MM_DEV_MODE) {
            $startDate->setDate('2014', '07', '28');
        }
        $startDate->setDate($startDate->format('Y'), $startDate->format('m') - 1, FACTU_FIXE_DAY);
        $endDate         = clone $startDate;
        $endDate->setDate($endDate->format('Y'), $endDate->format('m') + 1, FACTU_FIXE_DAY);
        $this->startDate = $startDate;
        return array($startDate, $endDate);
    }

    /**
     * Retourne l'abonnement en fonction de la présence d'un parent ou non
     * 
     * @param type $abonnement
     * @return array
     */
    protected function getAbonnement($abonnement) {
        if (!is_null($abonnement['parent_abonnement'])) {
            $abonnement = DetailClientDao::findOne('id = ' . $abonnement['parent_abonnement']);
            if (empty($abonnement)) {
                throw new Exception(sprintf("L'abonnement %d ne peux pas être trouvé !", $abonnement['parent_abonnement']));
            }
            return $this->getAbonnement($abonnement);
        }
        return $abonnement;
    }

    /**
     * Retourne les équipements de la période pour le codeclient passé
     * 
     * @todo ajouter les équipement directement dans la jointure (ceci est un copié/colé de l'ancien système)
     * @return array
     */
    protected function getEquipementForClient($codeClient) {
        global $bdd;
        $requete = $bdd->prepare("SELECT * FROM `commande_equipement_fixe` WHERE code_client = " . $codeClient . " AND equipement <> '' ");
        $requete->execute();

        $total_equipement = 0;
        $i                = 0;
        $tab_equipement   = array();

        while ($equipement = $requete->fetch(PDO::FETCH_OBJ)) {
            //vérification que la variable de la duree de financement soit bien remplie
            if ($equipement->duree_financement == 0 or $equipement->duree_financement == '') {
                $duree_financement = 1;
            } else {
                $duree_financement = $equipement->duree_financement;
            }

            //calcul des dates
            $date_fin_paiement       = strtotime($equipement->date_achat . " + " . $duree_financement . " month");
            $debut_mois_en_cours     = strtotime("first day of " . date("Y/m/d 00:00:00", time()));
            $debut_mois_achat        = strtotime("first day of " . $equipement->date_achat . " midnight");
            $debut_mois_fin_paiement = strtotime("first day of " . date("Y/m/d 00:00:00", $date_fin_paiement));

            // calcul des équipements a payer
            if ($debut_mois_en_cours < $debut_mois_fin_paiement and $debut_mois_en_cours >= $debut_mois_achat) {
                $tab_equipement[$i]['date']               = $equipement->date_achat;
                $tab_equipement[$i]['nom']                = $equipement->equipement;
                $tab_equipement[$i]['quantite']           = $equipement->quantite;
                $tab_equipement[$i]['prix']               = $equipement->prix;
                $tab_equipement[$i]['financement']        = $duree_financement;
                $tab_equipement[$i]['prix_finance']       = $equipement->prix / $duree_financement;
                $tab_equipement[$i]['prix_finance_total'] = $tab_equipement[$i]['prix_finance'] * $tab_equipement[$i]['quantite'];
                $tab_equipement[$i]['date_achat']         = $equipement->date_achat;

                $total_equipement = $total_equipement + $tab_equipement[$i]['prix_finance_total'];

                $i++;
            }
        }
        return array(
            'montant_total_equipement' => $total_equipement,
            'equipements'              => $tab_equipement
        );
    }

}

// Control droits d'accès
if (in_array($_SESSION['niveauAuth'], array('1', '3', '4', '7', '8'))) {
    $controller = new FacturationFixeController();
    $controller->process();
    redirect("lancement-facture");
} else {
    redirect("home-admin");
}